#include "main.h"
#include "../inc/font.h"

#define LCD_RST1  rt_pin_write(GET_PIN(A,1), PIN_HIGH);
#define LCD_RST0  rt_pin_write(GET_PIN(A,1), PIN_LOW);
//   LCD_DC
#define LCD_DC1  rt_pin_write(GET_PIN(A,2), PIN_HIGH);
#define LCD_DC0  rt_pin_write(GET_PIN(A,2), PIN_LOW);

//  LCD_CS
#define LCD_CS1 rt_pin_write(GET_PIN(A,0), PIN_HIGH);
#define LCD_CS0 rt_pin_write(GET_PIN(A,0), PIN_LOW);

//  LCD_CLK
#define LCD_CLK1  rt_pin_write(GET_PIN(A,6), PIN_HIGH);
#define LCD_CLK0  rt_pin_write(GET_PIN(A,6), PIN_LOW);
//  LCD_SDA
#define LCD_SDA1  rt_pin_write(GET_PIN(E,4), PIN_HIGH);
#define LCD_SDA0  rt_pin_write(GET_PIN(E,4), PIN_LOW);

static struct  aasd st7735;

void Gpio_Init(void){
    // 获得led成员
    st7735.LCD_CLK = rt_pin_get("PA.6");
    st7735.LCD_CS = rt_pin_get("PA.0");
    st7735.LCD_DC = rt_pin_get("PA.2");
    st7735.LCD_RST = rt_pin_get("PA.1");
    st7735.LCD_SDA = rt_pin_get("PE.4");
    st7735.LCD_LED = rt_pin_get("PA.7");
    // 设置引脚输出方式
    rt_pin_mode(st7735.LCD_CLK, PIN_MODE_OUTPUT);
    rt_pin_mode(st7735.LCD_CS, PIN_MODE_OUTPUT);
    rt_pin_mode(st7735.LCD_DC , PIN_MODE_OUTPUT);
    rt_pin_mode(st7735.LCD_RST, PIN_MODE_OUTPUT);
    rt_pin_mode(st7735.LCD_SDA, PIN_MODE_OUTPUT);
    rt_pin_mode(st7735.LCD_LED, PIN_MODE_OUTPUT);
    rt_pin_write(st7735.LCD_SDA, PIN_LOW);
    rt_pin_write(st7735.LCD_CS, PIN_HIGH);
    rt_pin_write(st7735.LCD_DC, PIN_LOW);
    rt_pin_write(st7735.LCD_RST, PIN_LOW);
    rt_pin_write(st7735.LCD_SDA, PIN_LOW);
    rt_pin_write(st7735.LCD_LED, PIN_HIGH);

}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------初始化 -----------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////

void spi2_8b_init(void)
	{

}
void spi2_16b_init(void)
	{

}

void lcd7735_senddata(uint8_t data)
{
	for(int i=0;i<8;i++){
	  LCD_CLK0;
		if( data& 0x80){
			LCD_SDA1;
		}
		else{
			LCD_SDA0;
		}
		LCD_CLK1;
		data = data<<1;
	}
}
void lcd7735_send16bData(uint16_t data)
	{
	for(int i=0;i<16;i++){
	  LCD_CLK0;
		if( data& 0x8000){
			LCD_SDA1;
		}
		else{
			LCD_SDA0;
		}
		LCD_CLK1;
		data = data<<1;
	}
}



void lcd7735_ini(void) {
    Gpio_Init();

	LCD_CS0;            // CS=0
	LCD_RST0;           // RST=0

	rt_thread_mdelay(10);
	LCD_RST1;           // RST=1
	rt_thread_mdelay(10);      //


	lcd7735_sendCmd(0x11); //

	rt_thread_mdelay(120);      //

	lcd7735_sendCmd(0x3A); //    режим цвета:
	lcd7735_sendData(0x05); //     16  бит
	lcd7735_sendCmd(0x36);// направление вывода изображения:
	lcd7735_sendData(0xA8); //0x1C-从下到上，从右到左，颜色的顺序 RGB;0x14-从下到上，从右到左，颜色的顺序 BGR
	lcd7735_sendCmd(0x29);//Display on
}


/////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------发送命令----------------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////

void lcd7735_sendCmd(unsigned char cmd) {
	LCD_DC0;//dc至0
	lcd7735_senddata(cmd);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------发送数据------------------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd7735_sendData(unsigned char data) {
	LCD_DC1;//我们把DC输出为单位T.K.传送数据
	lcd7735_senddata(data);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------填充指定屏幕区域----------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd7735_at(unsigned char startX, unsigned char startY, unsigned char stopX, unsigned char stopY) {
	lcd7735_sendCmd(0x2A);//列地址指令
	LCD_DC1;
	lcd7735_senddata(0x00);
	lcd7735_senddata(startX);
	lcd7735_senddata(0x00);
	lcd7735_senddata(stopX);

	lcd7735_sendCmd(0x2B);//序列地址指令
	LCD_DC1;
	lcd7735_senddata(0x00);
	lcd7735_senddata(startY);
	lcd7735_senddata(0x00);
	lcd7735_senddata(stopY);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//---------- 点亮所选直接空区的程序---------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd7735_fillrect(unsigned char startX, unsigned char startY, unsigned char stopX, unsigned char stopY, unsigned int color) {
	unsigned char y;
	unsigned char x;
	unsigned char msb = ((unsigned char)((color & 0xFF00) >> 8));//高8位
	unsigned char lsb = ((unsigned char)(color & 0x00FF));	//低8位
	LCD_CS0;//cs至0
	lcd7735_at(startX, startY, stopX, stopY);
	lcd7735_sendCmd(0x2C);//内存写入

	spi2_16b_init();// 初始化 16位
	LCD_DC1;//8位编码
	for (y = startY; y < stopY + 1; y++)
		for (x = startX; x < stopX + 1; x++) {
			lcd7735_send16bData(color);//将16位分成高8位和低8位
		//  lcd7735_sendData(msb);//8位编码
		//  lcd7735_sendData(lsb);//8位编码
		}
	spi2_8b_init();
	LCD_CS1;

}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------  点亮像素点   -------------------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd7735_putpix(unsigned char x, unsigned char y, unsigned int Color) {

	LCD_CS0;
	lcd7735_at(x, y, x, y);
	lcd7735_sendCmd(0x2C);//存储记录
	LCD_DC1;
	lcd7735_senddata((unsigned char)((Color & 0xFF00) >> 8));//根据预先协议，改变字节大小
	lcd7735_senddata((unsigned char)(Color & 0x00FF));
	LCD_CS1;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------     画线    -------------------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd7735_line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned int color) {
	signed char   dx, dy, sx, sy;
	unsigned char  x, y, mdx, mdy, l;

	if (x1 == x2) { //
		lcd7735_fillrect(x1, y1, x1, y2, color);//线路是直线的话
		return;
	}

	if (y1 == y2) { //
		lcd7735_fillrect(x1, y1, x2, y1, color);//线路是直线的话
		return;
	}
	//здесь расчет черчения косой линии
	dx = x2 - x1; dy = y2 - y1;

	if (dx >= 0) { mdx = dx; sx = 1; }
	else { mdx = x1 - x2; sx = -1; }
	if (dy >= 0) { mdy = dy; sy = 1; }
	else { mdy = y1 - y2; sy = -1; }

	x = x1; y = y1;

	if (mdx >= mdy) {//如果x线的长度小于x线
		l = mdx;
		while (l > 0) {
			if (dy > 0) { y = y1 + mdy * (x - x1) / mdx; }
			else { y = y1 - mdy * (x - x1) / mdx; }
			lcd7735_putpix(x, y, color);//清除当前的颜色，并重新开始
			x = x + sx;
			l--;
		}
	}
	else {
		l = mdy;//如果线路长度小于x
		while (l > 0) {
			if (dy > 0) { x = x1 + ((mdx * (y - y1)) / mdy); }
			else { x = x1 + ((mdx * (y1 - y)) / mdy); }
			lcd7735_putpix(x, y, color);//清除当前的颜色，并重新开始
			y = y + sy;
			l--;
		}
	}
	lcd7735_putpix(x2, y2, color);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------              绘制矩形（未填充）          ---------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd7735_rect(char x1, char y1, char x2, char y2, unsigned int color) {
	lcd7735_fillrect(x1, y1, x2, y1, color);
	lcd7735_fillrect(x1, y2, x2, y2, color);
	lcd7735_fillrect(x1, y1, x1, y2, color);
	lcd7735_fillrect(x2, y1, x2, y2, color);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------//字符//--------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd7735_putchar(unsigned char x, unsigned char y, unsigned char chr, unsigned int charColor, unsigned int bkgColor)
{
	unsigned char i;
	unsigned char j;

	LCD_CS0;

	lcd7735_at(x, y, x + 12, y + 8);//规定显示区域大小
	lcd7735_sendCmd(0x2C);//存储记录

	spi2_16b_init();// 初始化16进制
	LCD_DC1;//准备发送数据
	unsigned char k;
	for (i = 0; i < 7; i++)
		for (k = 2; k > 0; k--) {//K=1上半个字符，2下
			unsigned char chl = NewBFontLAT[((chr - 0x20) * 14 + i + 7 * (k - 1))];
			chl = chl << 2 * (k - 1); // 下半个字符移到1个位置左（从下面删除一条线）
			unsigned char h;
			if (k == 2) h = 6; else h = 7; // у нижней половины выведем только 6 точек вместо 7只有六点而不是七点。
			for (j = 0; j < h; j++) {
				unsigned int color;
				//rt_thread_mdelay(100);
				if (chl & 0x80) color = charColor; else color = bkgColor;//если MSBit==0 тогда оставляем цвет бэграунда,если нет тогда цвет //символа如果MS比特==0，然后我们离开的颜色
				chl = chl << 1;//将处理过的位移到左
				unsigned char msb = ((unsigned char)((color & 0xFF00) >> 8));
				unsigned char lsb = ((unsigned char)(color & 0x00FF));

				lcd7735_send16bData(color);
				// lcd7735_sendData(msb);
				//lcd7735_sendData(lsb);


			}
		}
	// 从块宽度符号的垂直线向右绘制

	unsigned char msb = ((unsigned char)((bkgColor & 0xFF00) >> 8));//高8位
	unsigned char lsb = ((unsigned char)(bkgColor & 0x00FF));	//低8位
	for (j = 0; j < 13; j++) {

		lcd7735_send16bData(bkgColor);//发16位数据
	  //	lcd7735_sendData(msb);
	  //	lcd7735_sendData(lsb);

	}
	spi2_8b_init();
	LCD_CS1;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//-------------------------------------//行输出字符串	//-----------------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd7735_putstr(unsigned char x, unsigned char y, const unsigned char str[], unsigned int charColor, unsigned int bkgColor) {

	while (*str != 0) {
		lcd7735_putchar(x, y, *str, charColor, bkgColor);
		y = y + 8;//Y轴间距
		str++;
	}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//-------------------------------------//输出32*32中文	//-----------------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////////////////
//void lcd7735_putchar(unsigned char x, unsigned char y, unsigned char chr, unsigned int charColor, unsigned int bkgColor)
void showhanzi32(unsigned int x,unsigned int y,unsigned char index, unsigned int charColor,unsigned int bkgColor)
{

	unsigned char i,j,k;
	const unsigned char *temp=hanzi32;
	temp+=index*128;	// 128——》32*4*8 --》根据生成的十六进制数的多少来取

	for(j=0;j<32;j++)//32行
	{
		for(k=0;k<4;k++)// 4个4个取--------------一列被分为4个16进制 k大小与取模大小有关
		{
			for(i=0;i<8;i++)//取模软件影响，每个16进制为8个二进制------------一个16进制为8位
			{
			 	if((*temp&(1<<i))!=0)//取二进制  为1 是字体 为0 是背景  (1<<i)) i每回左移一位与temp相与 如果temp第i为为1 输出为1 否则为0
				{
					if(i==0)
						lcd7735_putpix(x+(7-i),y+j,charColor);//通用任意字体
					else
						lcd7735_putpix(x+7*k+8-i,y+j,charColor);//通用任意字体
				}
				else
				{
					if(i==0)
						lcd7735_putpix(x+(7-i),y+j,bkgColor);
					else
						lcd7735_putpix(x+7*k+8-i,y+j,bkgColor);
				}
			}
			temp++;
		}
	 }
}
void showimage(uint16_t x,uint16_t y) //显示40*40图片
{
}




